#include <iostream>
#include <cstring>

using namespace std;

/* 拆分字符串 */
// str: 目标串，需要拆分的字符串
// splitstr: 分隔符字符串
// values: 拆分后结果存放的字符串数组
size_t splitstr(const char *str, const char *splitstr, char values[][31])
{
    if(str == nullptr || splitstr == nullptr) return 0; // 如果传进来的是空地址，直接返回，防止程序崩溃

    size_t slen = strlen(splitstr);         // 分隔符字符串的长度
    if(slen == 0) return 0;                 // 字符串为空没有任何意义

    size_t i = 0;                           // values数组中，有效数据项的个数
    char *p = (char *)str;                  // 待拆分字符串的内容，初始化指向目标串的起始地址

    while(true)
    {
        char *p1 = strstr(p, splitstr);     // 查找分隔符的位置

        if(p1 != nullptr)                   // 如果找到了分隔符
        {
            strncpy(values[i++], p, p1-p);  // 获取数据项的内容
            p = p1+slen;                    // p指向下一次待拆分字符串的起始位置
        }
        else                                // 如果没有找到分隔符，一定是最后一个数据项
        {
            strcpy(values[i++], p);         // 把最后一个数据项保存到数组中
            break;
        }
    }

    return i;           // 返回有效数据项的个数
}

int main(void)
{
    char values[20][31];
    memset(values, 0, sizeof(values));
    // size_t fieldcount = splitstr("aa,bb,cc,dd", ",", values);
    // size_t fieldcount = splitstr("aa,bb,cc,", ",", values);
    // size_t fieldcount = splitstr("aa,,cc,dd", ",", values);
    // size_t fieldcount = splitstr("aa", ",", values);
    size_t fieldcount = splitstr("", ",", values);
    
    for(size_t i=0; i<fieldcount; i++)
        cout << "values[" << i <<"]=" << values[i] <<endl;
    return 0;
}
